/**
 * Header de Echiquier.cxx
 *
 * @file Echiquier.h
 */

#if !defined Echiquier_h
#define Echiquier_h

#include "Piece.h"

class Piece;

/**
 * Declaration d'une classe modélisant une piece de jeu d'echec.
 */
class Echiquier
{
	public:
		/**
		 * Constructeur par défaut.
		 * Initialise à vide l'echiquier.
		 */
		Echiquier ();

		/**
		 * Recupere la piece situee sur une case.
		 *
		 * @param x un entier entre 1 et 8
		 * @param y un entier entre 1 et 8
		 *
		 * @return 0 si aucune piece n'est sur cette case et un pointeur
		 * vers une piece sinon.
		 */
		PiecePtr getPiece(int x, int y) const;

		/**
		 * Place une piece sur l'echiquier, aux coordonnees specifiees dans la piece.
		 *
		 * @param p un pointeur vers une piece
		 *
		 * @return 'true' si le placement s'est bien passe, 'false' sinon
		 * (case occupee, coordonnees invalides, piece vide )
		 */
		bool placer(PiecePtr p);

		/**
		 * Deplace une piece sur l'echiquier, des coordonnees specifiees
		 * dans la piece aux coordonnees x,y.
		 *
		 * @param p un pointeur vers une piece
		 * @param x un entier entre 1 et 8
		 * @param y un entier entre 1 et 8
		 *
		 * @return 'true' si le placement s'est bien passe, 'false' sinon
		 * (case occupee, coordonnees invalides, piece vide, piece pas
		 * presente au bon endroit sur l'echiquier)
		 */
		bool deplacer (PiecePtr p, int x, int y);

		/**
		 * Enleve la piece situee sur une case (qui devient vide).
		 *
		 * @param x un entier entre 1 et 8
		 * @param y un entier entre 1 et 8
		 *
		 * @return 0 si aucune piece n'est sur cette case et le pointeur
		 * vers la piece enlevee sinon.
		 */
		PiecePtr enleverPiece(int x, int y);

		/**
		 * Affiche l'echiquier avec des # pour les cases noires et . pour
		 * les blanches si elles sont vides, et avec B pour les pieces
		 * blanches et N pour les pieces noires.
		 */
		void affiche() const;

	private:
		/**
		 * Les cases de l'echiquier
		 */
		PiecePtr m_cases[64];
};

#endif // !defined Echiquier_h
